package com.leetcode.www;

import java.util.Arrays;
import java.util.PriorityQueue;

/**
 * Creared with IntelliJ IDEA.
 * Description:给定一组非负整数 nums，重新排列每个数的顺序（每个数不可拆分）使之组成一个最大的整数。
 *
 * 注意：输出结果可能非常大，所以你需要返回一个字符串而不是整数。
 *
 *  
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/largest-number
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * User:yxd
 * Date:2022-04-17
 * Time:22:27
 */
public class Normal179 {
    public String largestNumber(int[] nums) {
        StringBuilder stringBuilder = new StringBuilder();
        boolean[] bool = new boolean[nums.length];
        for(int i = 0;i < nums.length;i ++){
            int x = 0;
            int k = 0;
            for(int j = 0;j < nums.length;j ++){
                if(!bool[j]){
                    x = intM(x,nums[j]);
                    if(x == nums[j]){
                        k = j;
                    }
                }

            }
            stringBuilder.append(x);
            bool[k] = true;
        }

        if(stringBuilder.charAt(0) == '0'){
            return "0";
        }
        return stringBuilder.toString();
    }
    public int intM(int x,int y){//两个数中比较大的一个数
        String str = String.valueOf(x);
        String sub = String.valueOf(y);
        String str1 = str + sub;
        String sub1 = sub + str;
        long a = Long.valueOf(str1);
        long b = Long.valueOf(sub1);
        if(a > b){
            return x;
        }else{
            return y;
        }


    }
    public String largestNumber2(int[] nums) {
        PriorityQueue<String> heap = new PriorityQueue<>((x, y) -> (y + x).compareTo(x + y));//堆
        for(int x: nums) heap.offer(String.valueOf(x));
        String res = "";
        while(heap.size() > 0) res += heap.poll();
        if(res.charAt(0) == '0') return "0";
        return res;
    }

    public String largestNumber1(int[] nums) {
        int n = nums.length;
        // 转换成包装类型，以便传入 Comparator 对象（此处为 lambda 表达式）
        Integer[] numsArr = new Integer[n];
        for (int i = 0; i < n; i++) {
            numsArr[i] = nums[i];
        }

        Arrays.sort(numsArr, (x, y) -> {
            long sx = 10, sy = 10;
            while (sx <= x) {
                sx *= 10;
            }
            while (sy <= y) {
                sy *= 10;
            }
            return (int) (-sy * x - y + sx * y + x);
        });

        if (numsArr[0] == 0) {
            return "0";
        }
        StringBuilder ret = new StringBuilder();
        for (int num : numsArr) {
            ret.append(num);
        }
        return ret.toString();
    }



}
